﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DblogStudio.BLL;
using DblogStudio.DAL.Models;
using DblogStudio.GUI.Common;
using DblogStudio.GUI.Utils;

namespace DblogStudio.GUI.DuLieu
{
    public partial class FormPhanCongBaoTri : DblogStudio.GUI.Common.BaseDialog
    {
        bool allowReLoad = false;
        bool allowUpdate = false;
        public FormPhanCongBaoTri()
        {
            InitializeComponent();
            allowUpdate = false;
            LoadUser();
            InitTree();
            allowUpdate = true;
        }

        void LoadUser()
        {
            cmbNhanVien.DataSource = DblogStudio.BLL.HeThong.GetList(true, true);
            cmbNhanVien.DisplayMember = "FullName";
            cmbNhanVien.ValueMember = "UserName";
        }

        private void InitTree()
        {
            #region Khởi tạo cây
            treeChiTietMay.Nodes.Clear();
            var boldFont = new System.Drawing.Font(treeChiTietMay.Font, FontStyle.Bold);
            var lsCongDoan = BizCongDoanSanXuat.GetList(db);
            var manv = cmbNhanVien.SelectedValue.ToString();
            if (lsCongDoan != null && lsCongDoan.Count > 0)
            {
                foreach (var congDoan in lsCongDoan)
                {

                    var nodeCongDoan = new TreeNode(congDoan.TenCongDoanSanXuat);// + string.Format(" ({0}/{1}/{2})", quaHan, trongHan, truocHan));
                    nodeCongDoan.Tag = congDoan.MaCongDoanSanXuat;
                    nodeCongDoan.NodeFont = boldFont;
                    nodeCongDoan.Nodes.Add("...");

                    if (BizPhanCongBaoTri.CheckPermissionForCongDoan(manv, congDoan.MaCongDoanSanXuat, db))
                        nodeCongDoan.Expand();

                    treeChiTietMay.Nodes.Add(nodeCongDoan);
                }
            }
            #endregion
        }

        private void treeChiTietMay_BeforeExpand(object sender, TreeViewCancelEventArgs e)
        {
            var manv = cmbNhanVien.SelectedValue.ToString();
            if (e.Node.Nodes.Count == 0 || e.Node.Nodes[0].Text == "..." || allowReLoad)
            {
                #region Load Máy sản xuất
                if (e.Node.Level == 0)
                {
                    //Node đang chọn là công đoạn sản xuất ==> Load máy sản xuất của công đoạn tương ứng

                    e.Node.Nodes.Clear();
                    var congDoan = BizCongDoanSanXuat.GetByID(e.Node.Tag.ToString(), db);
                    if (congDoan != null)
                    {
                        var lsMaySanXuat = BizMaySanXuat.GetList(congDoan.MaCongDoanSanXuat, db);
                        if (lsMaySanXuat != null && lsMaySanXuat.Count > 0)
                        {
                            foreach (var maySanXuat in lsMaySanXuat)
                            {
                                var nodeMaySanXuat = new TreeNode(maySanXuat.TenMaySanXuat);//+ string.Format(" ({0}/{1}/{2})", quaHan, trongHan, truocHan));
                                nodeMaySanXuat.Tag = maySanXuat.MaMaySanXuat;
                                nodeMaySanXuat.Nodes.Add("...");

                                if (BizPhanCongBaoTri.CheckPermissionForMaySanXuat(manv, maySanXuat.MaMaySanXuat, db))
                                    nodeMaySanXuat.Expand();
                                e.Node.Nodes.Add(nodeMaySanXuat);
                            }
                        }
                    }
                }
                #endregion

                #region Load bộ phận sản xuất
                else if (e.Node.Level == 1)
                {
                    //Node đang chọn là node máy sản xuất ==> Load Bộ phận sản xuất
                    e.Node.Nodes.Clear();
                    var maySanXuat = BizMaySanXuat.GetByID(e.Node.Tag.ToString(), db);
                    if (maySanXuat != null)
                    {
                        var lsBoPhanMay = BizBoPhanMay.GetList(maySanXuat.MaMaySanXuat, db);
                        if (lsBoPhanMay != null && lsBoPhanMay.Count > 0)
                        {
                            foreach (var boPhanMay in lsBoPhanMay)
                            {
                                var nodeBoPhanMay = new TreeNode(boPhanMay.TenBoPhanMay);// + string.Format(" ({0}/{1}/{2})", quaHan, trongHan, truocHan));
                                nodeBoPhanMay.Tag = boPhanMay.MaBoPhanMay;
                                nodeBoPhanMay.Nodes.Add("...");
                                if (BizPhanCongBaoTri.CheckPermissionForBoPhanMay(manv, boPhanMay.MaBoPhanMay, db))
                                    nodeBoPhanMay.Expand();
                                e.Node.Nodes.Add(nodeBoPhanMay);
                            }
                        }
                    }
                }
                #endregion

                #region Load Chi tiết máy
                else if (e.Node.Level == 2)
                {
                    //Node đang chọn là node bộ phận sản xuất ==> Load Chi tiết máy
                    e.Node.Nodes.Clear();
                    var boPhanMay = BizBoPhanMay.GetByID(e.Node.Tag.ToString(), db);
                    if (boPhanMay != null)
                    {
                        var lsChiTietMay = BizChiTietMay.GetList(boPhanMay.MaBoPhanMay);
                        if (lsChiTietMay != null && lsChiTietMay.Count > 0)
                        {
                            var italicFont = new System.Drawing.Font(treeChiTietMay.Font, FontStyle.Italic);
                            foreach (var chiTietMay in lsChiTietMay)
                            {
                                //int trongHan = 0;
                                //int quaHan = 0;
                                //int truocHan = 0;
                                //BizChiTietMay.GetStatisCanhBao(chiTietMay.MaChiTietMay, out quaHan, out trongHan, out truocHan);
                                var nodeChiTietMay = new TreeNode(chiTietMay.TenChiTietMay);// + string.Format(" ({0}/{1}/{2})", quaHan, trongHan, truocHan));
                                nodeChiTietMay.Tag = chiTietMay.MaChiTietMay;
                                nodeChiTietMay.NodeFont = italicFont;
                                e.Node.Nodes.Add(nodeChiTietMay);
                                if (BizPhanCongBaoTri.CheckPermissionForChiTietMay(manv, chiTietMay.MaChiTietMay, db))
                                    nodeChiTietMay.Checked = true;
                            }
                        }
                    }
                }
                #endregion
            }
        }

        private void treeChiTietMay_AfterCheck(object sender, TreeViewEventArgs e)
        {
            if (e.Action == TreeViewAction.ByMouse)
            {
                if (e.Node.Nodes.Count > 0)
                {
                    e.Node.Expand();
                    //var fprogress = new FormProgress();
                    //fprogress.DoWork += (o, t) =>
                    //{
                    //    CheckAllChildNodes(e.Node, e.Node.Checked);
                    //};
                    //fprogress.RunWorkerCompleted += (o, t) =>
                    //{
                    //};
                    //fprogress.StartWorking(this);
                    BackgroundWorker worker = new BackgroundWorker();
                    //picProgress.Visible = true;
                    worker.DoWork += (o, t) =>
                    {
                        CheckAllChildNodes(e.Node, e.Node.Checked);
                    };
                    worker.RunWorkerCompleted += (o, t) =>
                    {
                        //picProgress.Visible = false;
                    };
                    worker.RunWorkerAsync(this);
                }
            }
        }

        private void CheckAllChildNodes(TreeNode treeNode, bool nodeChecked)
        {
            foreach (TreeNode node in treeNode.Nodes)
            {
                this.Invoke(new Action(() => { node.Checked = nodeChecked; node.Expand(); }));
                if (node.Nodes.Count > 0)
                {
                    CheckAllChildNodes(node, nodeChecked);
                }
            }
        }

        CEMS4UG_DHKHContext _db = null;
        public CEMS4UG_DHKHContext db
        {
            get
            {
                if (_db == null)
                    _db = CEMS4UG_DHKHContext.GetContext();
                return _db;
            }
        }

        private void btnPhanCong_Click(object sender, EventArgs e)
        {
            if (cmbNhanVien.SelectedIndex == -1)
            {
                DialogUtils.ShowError("Vui lòng chọn nhân viên cần phân công");
            }
            else
            {
                var manv = cmbNhanVien.SelectedValue.ToString();
                var fp = new FormProgress();
                fp.DoWork += (o, t) =>
                {

                    foreach (TreeNode node in treeChiTietMay.Nodes)
                        CapNhatPhanCong(node, manv);
                    _db.Dispose();
                    _db = null;
                };
                fp.RunWorkerCompleted += (o, t) =>
                {
                    DialogUtils.ShowMessage("Đã cập nhật thông tin phân công bảo trì cho nhân viên " + cmbNhanVien.SelectedText + " thành công");
                };
                fp.StartWorking(this);
            }
        }

        private void CapNhatPhanCong(TreeNode treeNode, string manv)
        {
            foreach (TreeNode node in treeNode.Nodes)
            {
                if (node.Level == 3)
                {
                    if (node.Tag != null)
                    {
                        PhanCongBaoTri obj = new PhanCongBaoTri
                        {
                            MaNhanVien = manv,
                            MaChiTietMay = node.Tag.ToString(),
                            MaBoPhanMay = node.Parent.Tag.ToString(),
                            MaMaySanXuat = node.Parent.Parent.Tag.ToString(),
                            MaCongDoan = node.Parent.Parent.Parent.Tag.ToString()
                        };
                        if (node.Checked)
                            BizPhanCongBaoTri.Update(obj, db);
                        else
                            BizPhanCongBaoTri.Delete(obj, db);
                    }

                }
                CapNhatPhanCong(node, manv);
            }
        }

        private void cmbNhanVien_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (allowUpdate)
                InitTree();
        }
    }
}
